#include<bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
const int N=2e5+10;
#define INF 0x3f3f3f3f;
typedef long long int ll;
#define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
//----------------------------------------------------------------------------//
int a[N];//死多少次
int n,m,u,v,q,op;
void solve()
{
	cin>>n>>m;//有n个点,且n个点都存在
	//size_t tt=n*4;
	memset (a, 0, n*4+4 );

	for(int i=1;i<=m;i++)
	{
		cin>>u>>v;
		if(u>v) a[v]++;//哪个点小,哪个点++,加一次代表死一次
		else a[u]++;
	}

	int ans=0;
	for(int i=1;i<=n;i++) if(!a[i]) ans++;

	cin>>q;
	while(q--)
	{
		cin>>op;
		if(op==3) cout<< ans<<'\n';
		else
		{
			cin>>u>>v;
			if(op==1)//添加v到u的边
			{
				if(u>v)//如果v原来或者现在就要死了
				{
					if(!a[v]) ans--;
					a[v]++;
				}
				else if(v>u)
				{
					if(!a[u]) ans--;
					a[u]++;
				}
			}
			else if(op==2)//删除v到u的边,看小的那个死的次数--
			{
				if(v<u)
				{
					a[v]--;
					if(a[v]==0) ans++;
				}
				else if(v>u)
				{
					a[u]--;//题目保证有边才减
					if(a[u]==0) ans++;
				}
			}

		}

	}



	
}

int main()
{
	close();
	//int T; cin>>T;
	//while (T--) solve();
	solve();
	return 0;
}
//n个点m个边 ,一个边上较小的数会被去掉 问最后剩几个数 q次询问,1是添加v到u的边 2是删除v到u的边 3多少活着

//看某个人死多少次,>0这个边就无了,==0就有